package com.zdsoft.wms.interceptor;


import com.zdsoft.wms.utils.CookieUtil;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * 利用拦截器传递token
 * 这里有个坑 需要配置hystrix隔离策略为信号量模式 否则调用会报错会造成请求头丢失
 *
 * 转发Feign的请求头的时候, 如果开启了Hystrix, Hystrix的默认隔离策略是Thread(线程隔离策略), 因此转发拦截器内是无法获取到请求的请求头信息的。

 可以修改默认隔离策略为信号量模式：

 hystrix.command.default.execution.isolation.strategy=SEMAPHORE
 但信号量模式不是官方推荐的隔离策略;另一个解决方法就是自定义Hystrix的隔离策略。
 */
@Slf4j
@Component
public class TokenRelayInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        System.out.println("zzzzzzzzzzzzzzzzzz");
        // 1. 获取到token
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;
        HttpServletRequest request = attributes.getRequest();
        String token = request.getHeader("X-Token");
        System.out.println(token + "zzzzzzzzzzzzzzzzzz");
        // 2. 将token传递
        if (StringUtils.isNotBlank(token)) {
            requestTemplate.header("X-Token", token);
        }
    }


}
